﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace ESpace
{
    public partial class EGrid : UserControl
    {
        
        Label[,] lbl;
        public int W { get { return clW.Length; } }
        public int H { get { return clH.Length; } }

        int[] clW;
        int[] clH;
        
        public int[] ColWidth
        {
            get { return clW; }
            set 
            {
                // если изменено количество столбцов
                if (clW.Length != value.Length)
                {
                    // удаляем все контролы
                    Controls.Clear();
                    Label[,] lbl1 = new Label[value.Length, H];


                    // создаем новый массив на основе старого
                    // и вновь добавляем в контролы
                    for (int i = 0; i < value.Length; i++)
                        for (int j = 0; j < H; j++)
                        {
                            lbl1[i, j] = CreateNewLabel();
                            Controls.Add(lbl1[i, j]);
                        }

                    // диспозим старый массив
                    for (int i = 0; i < W; i++)
                        for (int j = 0; j < H; j++)
                        {
                            lbl[i, j].Dispose();
                        }

                    // присваиваем новый массив
                    lbl = lbl1;

                }

                clW = value;
                ReSetPosLbl(); 
            }
        }

        public int[] RowHeight
        {
            get { return clH; }
            set
            { 
                // если изменено количество столбцов
                if (clH.Length != value.Length)
                {
                    // удаляем все контролы
                    Controls.Clear();

                    // создаем новый массив на основе старого
                    // и вновь добавляем в контролы
                    Label[,] lbl1 = new Label[W, value.Length];
                    for (int i = 0; i < W; i++)
                        for (int j = 0; j < value.Length; j++)
                        {
                            lbl1[i, j] = CreateNewLabel();
                            Controls.Add(lbl1[i, j]);
                        }

                    // диспозим старый массив
                    for (int i = 0; i < W; i++)
                        for (int j = 0; j < H; j++)
                        {
                            lbl[i, j].Dispose();
                        }

                    // присваиваем новый массив
                    lbl = lbl1;

                }

                clH = value;
                ReSetPosLbl();
            }
        }

        public EGrid()
        {
            InitializeComponent();
            
            int W = 3;
            int H = 3;
            lbl = new Label[W, H];
            clW = new int[W];
            clH = new int[H];
            BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
            for (int i = 0; i < W; i++)
            {
                clW[i] = 30;
                for (int j = 0; j < H; j++)
                {
                    clH[j] = 15;
                    lbl[i, j] = CreateNewLabel();
                    Controls.Add(lbl[i, j]);
                }
            }
            ReSetPosLbl();
        }

        Label CreateNewLabel()
        {
            Label ret = new Label();
            ret.AutoSize = false;
            ret.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            ret.Text = "";
            return ret;
        }

        public void SetColWidth(int indCol, int newSize)
        {
            clW[indCol] = newSize;
            ReSetPosLbl();
        }

        public void SetColWidth(int[] newSize)
        {
            for (int i = 0; i < clW.Length; i++)
                clW[i] = newSize[i];
            ReSetPosLbl();
        }

        public void SetRowHeight(int indRow, int newSize)
        {
            clH[indRow] = newSize;
            ReSetPosLbl();
        }

        public void SetRowHeight(int[] newSize)
        {
            for (int i = 0; i < clH.Length; i++)
                clH[i] = newSize[i];
            ReSetPosLbl();
        }

        public void SetString(String newString, int i, int j)
        {
            lbl[i, j].Text = newString;
        }

        public void SetBkColor(Color newColor, int i, int j)
        {
            lbl[i, j].BackColor = newColor;
        }

        public void SetBold(bool bold, int i, int j)
        {
            if (bold && !lbl[i, j].Font.Bold)
                lbl[i, j].Font = new Font(lbl[i, j].Font.Name, lbl[i, j].Font.Size, FontStyle.Bold);

            if (!bold && lbl[i, j].Font.Bold)
                lbl[i, j].Font = new Font(lbl[i, j].Font.Name, lbl[i, j].Font.Size, FontStyle.Regular);
        }

        override public void Refresh()
        {
            ReSetPosLbl();
            base.Refresh();
        }

        void ReSetPosLbl()
        {
            int x = 3;
            int y = 3;
            for (int i = 0; i < W; i++)
            {
                y = 3;
                for (int j = 0; j < H; j++)
                {
                    lbl[i, j].Size = new Size(clW[i] + 1, clH[j] + 1);
                    lbl[i, j].Location = new Point(x, y);
                    y += clH[j];
                }
                x += clW[i];
            }
            Size = new Size(x + 7, y + 7);
        }
        
    }
}
